package com.goods.business.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.goods.business.mapper.ProductMapper;
import com.goods.business.mapper.ProductStockMapper;
import com.goods.business.service.ProductService;
import com.goods.common.model.business.Product;
import com.goods.common.vo.business.ProductStockVO;
import com.goods.common.vo.business.ProductVO;
import com.goods.common.vo.system.PageVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author XiaoHong
 * @description
 * @date 2022/2/17
 */
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductMapper productMapper;

    //物资资料分页列表展示:用户可以根据分类、物资名称（模糊）和物资状态进行条件查询
    @Override
    public PageVO<ProductVO> findProductList(Integer pageNum, Integer pageSize, Map map) {
        //开启分页
        PageHelper.startPage(pageNum, pageSize);
        //设置查询对象  其实有点相似  new QueryWrapper
        Example example = new Example(Product.class);
        //创建查询条件
        Example.Criteria criteria = example.createCriteria();
        //判断前端传到后台的数据是否存在物资名称，模糊查询
        if (!"".equals(map.get("name")) && null != map.get("name")) {
            //存在
            criteria.andLike("name", "%" + map.get("name") + "%");
        }
        //判断前端传到后台的数据是否存在物资状态，精准查询
        if (!"".equals(map.get("status")) && null != map.get("status")) {
            //存在
            criteria.andEqualTo("status", map.get("status"));
        }
        //判断前端传到后台的数据是否存在分类信息 ， 精准查询
        if (!"".equals(map.get("categorys")) && null != map.get("categorys")) {
            //存在
            String categoryStr = (String) map.get("categorys");
            String[] split = categoryStr.split(",");
            criteria.andEqualTo("threeCategoryId", Long.valueOf(split[2]));
        }

        //进行查询
        List<Product> productList = productMapper.selectByExample(example);
        //封装返回数据
        //进行偷天换日
        List<ProductVO> ProductVOList = productList.stream().map(productList1 -> {
            ProductVO vo = new ProductVO();
            BeanUtils.copyProperties(productList1, vo);
            return vo;
        }).collect(Collectors.toList());
        //将数据对象放入到page中，可以计算出总共的数量.(注意当开启分页之后，查询出来的数据其实已经是当前的页的数据了)
        PageInfo<Product> productPageInfo = new PageInfo(productList);

        System.out.println(productPageInfo.getTotal());
        return new PageVO<ProductVO>(productPageInfo.getTotal(),   //这个地方的总数量，如果是从pageInfo中拿出来的就是总数居，而不是当前页中数据的数量
                ProductVOList);
    }

    //添加物资   2: 待审核 。
    @Override
    public void add(Product product) {
        //1准备数据{sort=1, name=213123, imageUrl=group1/M00/00/00/wKi7gWIN63WAGfZ2AAAH4OkHq7Y134.PNG, model=123123, categoryKeys=[24, 31, 52], unit=123123, remark=123123123}
        //{pageNum=1, pageSize=6, name=, categoryId=, supplier=, status=0}  map形式的。
//      实体类  Product(id=null, pNum=null, name=121, model=123123, unit=123213, remark=123123123, sort=1, createTime=null, modifiedTime=null, oneCategoryId=null, twoCategoryId=null, threeCategoryId=null, imageUrl=group1/M00/00/00/wKi7gWIN7_aASzDvAAAM0wEyAKQ886.JPG, status=null, categoryKeys=[33, 34, 37])
        //TODO 商品编号  这个不知道  ！！！  看看后面是不是有传的，或者自己uuid.  这个地方先用uuid把。
        product.setPNum(UUID.randomUUID().toString());
        List<Long> categoryKeys = product.getCategoryKeys();
        product.setOneCategoryId(categoryKeys.get(0));
        product.setTwoCategoryId(categoryKeys.get(1));
        product.setThreeCategoryId(categoryKeys.get(2));
//        productMapper.insertSelective()//只给有值的赋值
        product.setCreateTime(new Date());
        product.setModifiedTime(new Date());
        product.setStatus(2);
        productMapper.insert(product);

    }

    @Override
    public Product edit(Long productId) {
        return productMapper.selectByPrimaryKey(productId);
    }

    //    物资编辑界面点击修改确认
    @Override
    public void update(Product product, Long productId) {
        product.setId(productId);
        product.setModifiedTime(new Date());
        productMapper.updateByPrimaryKey(product);
    }

    //将物资移入到回收站  (status:1)
    @Override
    public void remove(Long productId) {
        Product product = new Product();
        product.setId(productId);
        product.setStatus(1);
        productMapper.updateByPrimaryKeySelective(product);
    }

    //将物资从回收站恢复(status:0)
    @Override
    public void back(Long productId) {
        Product product = new Product();
        product.setId(productId);
        product.setStatus(0);
        productMapper.updateByPrimaryKeySelective(product);//空值掠过，不进行修改
    }

    //通过审核
    @Override
    public void publish(Long productId) {
        Product product = new Product();
        product.setId(productId);
        product.setStatus(0);
        productMapper.updateByPrimaryKeySelective(product);
    }

    @Autowired
    private ProductStockMapper productStockMapper;

    //将物资删除
    @Override
    public void delete(Long productId) {
        productMapper.deleteByPrimaryKey(productId);
    }

    //加载分类下的库存信息
    @Override
    public PageVO<ProductStockVO> findProductStocks(Integer pageNum, Integer pageSize, String categorys, String name) {

        List<Map> mapList = getStockMaps(pageNum, pageSize, categorys, name);
        //处理数据：
        //类型转换
        List<ProductStockVO> collect = mapList.stream().map(map -> {
            String jsonString = JSON.toJSONString(map);
            ProductStockVO productStockVO = JSONObject.parseObject(jsonString, ProductStockVO.class);
            return productStockVO;
        }).collect(Collectors.toList());
        PageInfo<ProductStockVO> pageInfo = new PageInfo<>(collect);
        return new PageVO<ProductStockVO>(pageInfo.getTotal(), collect);

    }

    //查询数据库中的物资库存信息
    private List<Map> getStockMaps(Integer pageNum, Integer pageSize, String categorys, String name) {
        Long three =null;
        if (!StringUtils.isEmpty(categorys)){
            //切割前端的分类数据
            String[] split = categorys.split(",");
            three = Long.valueOf(split[2]);
        }
        PageHelper.startPage(pageNum, pageSize);

        //查询需要的数据。
        return productStockMapper.findProductStocks(three, name);
    }

    //    物资所有的库存信息 （当前页？）
    //   ）
    @Override
    public List<Map> findAllStocks(Integer pageNum, Integer pageSize, String categorys, String name) {
        PageHelper.startPage(pageNum, pageSize);
        //查询所有的库存信息需要的数据。
        Long three =null;
        if (!StringUtils.isEmpty(categorys)){
            //切割前端的分类数据
            String[] split = categorys.split(",");
            three = Long.valueOf(split[2]);
        }
        List<Map>  mapList = productStockMapper.findAllStocks(three);
//        PageInfo<List<Map>> pageInfo = new PageInfo(mapList);
        return mapList;
    }


}
